package com.tjy.common.utils;

import org.apache.commons.lang3.StringUtils;
import java.util.regex.Pattern;

/**
 * 手机号工具类
 * 支持国内手机号格式校验、脱敏、号段合法性判断等操作
 * @author tjy
 */
public class PhoneUtils {

    /**
     * 国内手机号正则表达式（支持最新号段）
     * 规则：
     * 1. 共11位数字
     * 2. 开头为 13[0-9]、14[01456879]、15[0-35-9]、16[2567]、17[0-8]、18[0-9]、19[0-35-9]
     * 3. 覆盖三大运营商及虚拟运营商常见号段
     */
    private static final Pattern CHINA_PHONE_PATTERN = Pattern.compile(
            "^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$"
    );

    /**
     * 校验手机号是否为国内合法格式
     * @param phoneNum 待校验的手机号（可为null或空字符串）
     * @return true=合法，false=不合法
     */
    public static boolean isValidPhone(String phoneNum) {
        // 先判断是否为空/非数字
        if (StringUtils.isEmpty(phoneNum) || !StringUtils.isNumeric(phoneNum)) {
            return false;
        }
        // 再通过正则校验格式
        return CHINA_PHONE_PATTERN.matcher(phoneNum).matches();
    }

    /**
     * 手机号脱敏（中间4位替换为*）
     * 例：13812345678 → 138****5678
     * @param phoneNum 待脱敏的手机号（需先确保格式合法）
     * @return 脱敏后的手机号，若输入不合法则返回原字符串
     */
    public static String desensitizePhone(String phoneNum) {
        if (!isValidPhone(phoneNum)) {
            return phoneNum; // 输入不合法时不处理，返回原内容
        }
        // 截取前3位 + **** + 后4位
        return phoneNum.substring(0, 3) + "****" + phoneNum.substring(7);
    }

    /**
     * 判断手机号是否为虚拟运营商号段
     * 虚拟运营商号段参考（2024年）：162、165、167、170[0-2]、171、195、197、198
     * @param phoneNum 待判断的手机号（需先确保格式合法）
     * @return true=虚拟运营商，false=三大运营商（移动/联通/电信）
     */
    public static boolean isVirtualOperatorPhone(String phoneNum) {
        if (!isValidPhone(phoneNum)) {
            return false; // 格式不合法时返回false
        }
        // 提取手机号前4位（部分号段需前4位判断，如1700-1702）
        String prefix3 = phoneNum.substring(0, 3); // 前3位
        String prefix4 = phoneNum.substring(0, 4); // 前4位

        // 虚拟运营商前3位号段
        boolean isVirtualPrefix3 = "162".equals(prefix3) 
                || "165".equals(prefix3) 
                || "167".equals(prefix3) 
                || "171".equals(prefix3) 
                || "195".equals(prefix3) 
                || "197".equals(prefix3) 
                || "198".equals(prefix3);

        // 虚拟运营商前4位号段（170开头的细分号段）
        boolean isVirtualPrefix4 = "1700".equals(prefix4) 
                || "1701".equals(prefix4) 
                || "1702".equals(prefix4);

        return isVirtualPrefix3 || isVirtualPrefix4;
    }

    /**
     * 获取手机号所属运营商（仅支持国内三大运营商及虚拟运营商）
     * @param phoneNum 待查询的手机号（需先确保格式合法）
     * @return 运营商名称（如"中国移动"、"中国联通"、"中国电信"、"虚拟运营商"），格式不合法则返回"未知"
     */
    public static String getOperator(String phoneNum) {
        if (!isValidPhone(phoneNum)) {
            return "未知";
        }

        // 若为虚拟运营商，直接返回
        if (isVirtualOperatorPhone(phoneNum)) {
            return "虚拟运营商";
        }

        // 提取前3位号段，判断三大运营商
        String prefix3 = phoneNum.substring(0, 3);
        switch (prefix3) {
            // 中国移动号段
            case "134":
            case "135":
            case "136":
            case "137":
            case "138":
            case "139":
            case "147":
            case "148":
            case "150":
            case "151":
            case "152":
            case "157":
            case "158":
            case "159":
            case "172":
            case "178":
            case "182":
            case "183":
            case "184":
            case "187":
            case "188":
            case "198":
                return "中国移动";
            // 中国联通号段
            case "130":
            case "131":
            case "132":
            case "145":
            case "146":
            case "155":
            case "156":
            case "166":
            case "175":
            case "176":
            case "185":
            case "186":
            case "196":
                return "中国联通";
            // 中国电信号段
            case "133":
            case "149":
            case "153":
            case "173":
            case "174":
            case "177":
            case "180":
            case "181":
            case "189":
            case "199":
                return "中国电信";
            // 其他未明确号段（极少情况）
            default:
                return "未知";
        }
    }
}